# -*- coding:utf-8 -*-
# @FileName : app\models\role.py
# @Time     : 2025/11/28
# @Author   : 天空之城
"""角色与权限模型文件

此模块定义角色和权限模型，使用SQLAlchemy进行ORM映射。
"""
from app.extensions import db


class Role(db.Model):
    """角色模型
    
    定义用户角色表结构，用于权限管理。
    """
    __tablename__ = 'roles'
    
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 角色ID
    name = db.Column(db.String(50), unique=True, nullable=False)  # 角色名称
    description = db.Column(db.String(200), nullable=True)  # 角色描述
    created_at = db.Column(db.DateTime, default=db.func.current_timestamp())  # 创建时间
    updated_at = db.Column(db.DateTime, default=db.func.current_timestamp(), onupdate=db.func.current_timestamp())  # 更新时间
    
    # 关系定义
    users = db.relationship('User', secondary='user_roles', lazy='dynamic', back_populates='roles')
    
    def __repr__(self):
        """返回角色对象的字符串表示"""
        return f'<Role {self.name}>'


class Permission(db.Model):
    """权限模型
    
    定义系统权限表结构，用于细粒度的权限控制。
    """
    __tablename__ = 'permissions'
    
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 权限ID
    name = db.Column(db.String(50), unique=True, nullable=False)  # 权限名称
    description = db.Column(db.String(200), nullable=True)  # 权限描述
    created_at = db.Column(db.DateTime, default=db.func.current_timestamp())  # 创建时间
    updated_at = db.Column(db.DateTime, default=db.func.current_timestamp(), onupdate=db.func.current_timestamp())  # 更新时间
    
    # 关系定义
    roles = db.relationship('Role', secondary='role_permissions', backref=db.backref('permissions', lazy='dynamic'))
    
    def __repr__(self):
        """返回权限对象的字符串表示"""
        return f'<Permission {self.name}>'


# 关联表
user_roles = db.Table('user_roles',
    db.Column('user_id', db.Integer, db.ForeignKey('users.id'), primary_key=True),
    db.Column('role_id', db.Integer, db.ForeignKey('roles.id'), primary_key=True)
)

role_permissions = db.Table('role_permissions',
    db.Column('role_id', db.Integer, db.ForeignKey('roles.id'), primary_key=True),
    db.Column('permission_id', db.Integer, db.ForeignKey('permissions.id'), primary_key=True)
)
